/**
 * 请求封装
 * 统一处理请求拦截、响应拦截、错误处理等
 */

import config from '../config/config.js';

// 服务器基础URL
const BASE_URL = config.API_BASE_URL;

/**
 * 请求拦截器
 * @param {Object} options - 请求配置
 * @returns {Object} 处理后的请求配置
 */
const requestInterceptor = (options) => {
  // 获取token
  const token = uni.getStorageSync('token');
  
  // 设置请求头
  if (!options.header) {
    options.header = {};
  }
  
  // 添加token
  if (token) {
    options.header['Authorization'] = `Bearer ${token}`;
    options.header['X-Access-Token'] = token; // 兼容后端
  }
  
  // 添加内容类型
  if (!options.header['Content-Type'] && options.method !== 'GET') {
    options.header['Content-Type'] = 'application/json';
  }
  
  // 添加请求时间戳
  options.header['Request-Time'] = new Date().getTime();
  
  return options;
};

/**
 * 响应拦截器
 * @param {Object} response - 响应数据
 * @returns {Object} 处理后的响应数据
 */
const responseInterceptor = (response) => {
  // 请求成功
  if (response.statusCode >= 200 && response.statusCode < 300) {
    return response;
  }
  
  // 处理401未授权
  if (response.statusCode === 401) {
    handleUnauthorized();
    return Promise.reject(new Error('未授权或登录已过期'));
  }
  
  // 处理403禁止访问
  if (response.statusCode === 403) {
    uni.showToast({
      title: '您没有权限进行此操作',
      icon: 'none'
    });
    return Promise.reject(new Error('没有权限'));
  }
  
  // 处理404未找到
  if (response.statusCode === 404) {
    return Promise.reject(new Error('请求的资源不存在'));
  }
  
  // 处理500服务器错误
  if (response.statusCode >= 500) {
    uni.showToast({
      title: '服务器错误，请稍后再试',
      icon: 'none'
    });
    return Promise.reject(new Error('服务器错误'));
  }
  
  // 其他错误
  return Promise.reject(new Error(`请求失败，状态码: ${response.statusCode}`));
};

/**
 * 处理未授权情况
 */
const handleUnauthorized = () => {
  // 清除本地存储
  uni.removeStorageSync('token');
  uni.removeStorageSync('user');
  uni.removeStorageSync('access_token');
  
  // 显示提示
  uni.showToast({
    title: '登录已过期，请重新登录',
    icon: 'none'
  });
  
  // 延迟跳转到登录页
  setTimeout(() => {
    uni.reLaunch({
      url: '/pages/login/login'
    });
  }, 1500);
};

/**
 * 请求函数
 * @param {Object} options - 请求配置
 * @returns {Promise} 请求Promise
 */
const request = (options) => {
  // 补全url
  let url = options.url;
  if (!url.startsWith('http')) {
    url = BASE_URL + url;
  }
  
  // 应用请求拦截器
  const interceptedOptions = requestInterceptor({
    ...options,
    url
  });
  
  // 发送请求
  return new Promise((resolve, reject) => {
    uni.request({
      ...interceptedOptions,
      success: (res) => {
        try {
          // 应用响应拦截器
          const result = responseInterceptor(res);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      },
      fail: (error) => {
        // 网络错误或其他原因
        uni.showToast({
          title: '网络错误，请检查网络连接',
          icon: 'none'
        });
        reject(error);
      }
    });
  });
};

// 导出请求函数
export default request; 